package come.bjpowernode.javase.reflect;

import come.bjpowernode.javase.reflect.bin.Student;

import java.lang.reflect.Field;

/*
怎么通过反射机制，访问一个java对象的属性？
    给属性赋值；
    获取属性的值；
 */
public class ReflectTest07 {
    public static void main(String[] args) throws Exception {
        //我们不使用反射机制，怎么获取对象的属性
        Student student = new Student();
        student.no = 111;
        System.out.println(student.no);

        //使用反射机制怎么访问一个对象的属性。（set，get）
        Class studentClass = Class.forName("come.bjpowernode.javase.reflect.bin.Student");
        Object obj = studentClass.newInstance();//obj就是Student对象，底层调用无参数构造方法，实例化对象。
        //获取no属性(根据属性的名称获取field)
        Field noField = studentClass.getDeclaredField("no");

        //给obj对象（Student对象）的no属性赋值
        noField.set(obj,2222);//给obj对象的no属性赋值

        //读取属性的值
        Object obj2 = noField.get(obj);
        System.out.println(obj2);

        //可以访问私有属性吗
        Field nameField = studentClass.getDeclaredField("name");
        //打破封装(反射机制的缺点，打破封装，可能会给不发分子留下机会！！！)
        //这样设置以后，在外部也能访问私有属性
        nameField.setAccessible(true);
        nameField.set(obj,"jack");
        System.out.println(nameField.get(obj));
    }
}
